home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / FusionIcon / environment.py < prev    next >
Text File  |  2008-11-09  |  5KB  |  154 lines

  1. # This file is part of Fusion-icon.
  2.  
  3. # Fusion-icon is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # Fusion-icon is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  15. #
  16. # Author(s): crdlb, nesl247
  17. #
  18. # Copyright 2007 Christopher Williams <christopherw@verizon.net> 
  19.  
  20. import os
  21. from execute import run
  22.  
  23. tfp = 'GLX_EXT_texture_from_pixmap'
  24. GDSID = 'GNOME_DESKTOP_SESSION_ID'
  25.  
  26. class Environment:
  27.  
  28.     '''Detects properties of the enviroment, and provides a set() method that uses this information to export environment variables needed to start compiz.'''
  29.     
  30.  
  31.     def __init__(self):
  32.  
  33.         '''desktop: current desktop enviroment used to choose interface, fallback wm, and default decorator
  34.     
  35. failsafe: boolean, True if in a failsafe session, currently only supports gnome failsafe mode.
  36.  
  37. glxinfo: output of glxinfo command
  38.  
  39. indirect_glxinfo: output of glxinfo with LIBGL_ALWAYS_INDIRECT
  40.  
  41. xvinfo: output of xvinfo
  42.  
  43. glx_vendor: 'client glx vendor:' usually one of SGI (for mesa-based drivers), NVIDIA Corporation, or ATI.
  44.  
  45. tfp: 'direct' if texture_from_pixmap is present with direct rendering (implying presence with indirect as well), 'indirect' if only present with indirect context, False if not present at all
  46.  
  47. Xgl: True in Xgl'''
  48.  
  49.         # Check gnome- and kde-specific vars, then try generic 'DESKTOP_SESSION'
  50.         if GDSID in os.environ:
  51.             self.desktop = 'gnome'
  52.  
  53.         elif 'KDE_FULL_SESSION' in os.environ: 
  54.             self.desktop = 'kde'
  55.  
  56.         else:
  57.             self.desktop = os.environ.get('DESKTOP_SESSION', 'unknown')
  58.  
  59.         self.failsafe = False
  60.         if self.desktop == 'gnome' and GDSID in os.environ and os.environ[GDSID] == 'failsafe':
  61.             self.failsafe = True
  62.         
  63.         if self.failsafe:
  64.             failsafe_str = 'failsafe '
  65.         else:
  66.             failsafe_str = ''
  67.  
  68.         # hack to eliminate inconsistency
  69.         if self.desktop == 'kde4':
  70.             self.desktop = 'kde'
  71.  
  72.  
  73.         print ' * Detected Session: %s%s' %(failsafe_str, self.desktop)
  74.  
  75.  
  76.         ## Save the output of glxinfo and xvinfo for later use:
  77.  
  78.         # don't try to run glxinfo unless it's installed
  79.         if run(['which', 'glxinfo'], 'call', quiet=True) == 0:
  80.             self.glxinfo = run('glxinfo', 'output')
  81.         else:
  82.             raise SystemExit, ' * Error: glxinfo not installed!'
  83.  
  84.         # make a temp environment 
  85.         indirect_environ = os.environ.copy()
  86.         indirect_environ['LIBGL_ALWAYS_INDIRECT'] = '1'
  87.         self.indirect_glxinfo = run('glxinfo', 'output', env=indirect_environ)
  88.  
  89.         if run(['which', 'xvinfo'], 'call', quiet=True) == 0:
  90.             self.xvinfo = run('xvinfo', 'output')
  91.         else:
  92.             raise SystemExit, ' * Error: xvinfo not installed!'
  93.  
  94.         self.glx_vendor = None
  95.         line = [l for l in self.glxinfo.splitlines() if 'client glx vendor string:' in l]
  96.         if line:
  97.             self.glx_vendor = ' '.join(line[0].split()[4:])
  98.  
  99.         ## Texture From Pixmap / Indirect
  100.         self.tfp = False
  101.         if self.glxinfo.count(tfp) < 3:
  102.             if self.indirect_glxinfo.count(tfp) == 3:
  103.                 self.tfp = 'indirect'
  104.         else:
  105.             self.tfp = 'direct'
  106.  
  107.         ## Xgl
  108.         if 'Xgl' in self.xvinfo:
  109.             self.Xgl = True
  110.  
  111.         else:
  112.             self.Xgl = False
  113.  
  114.     def set(self):
  115.  
  116.         '''Trigger all environment checks'''
  117.  
  118.         # Check for Intel and export INTEL_BATCH
  119.         if 'Intel' in self.glxinfo:
  120.             print ' * Intel detected, exporting: INTEL_BATCH=1'
  121.             os.environ['INTEL_BATCH'] = '1'
  122.  
  123.         # Check TFP and export LIBGL_ALWAYS_INDIRECT if needed
  124.         if self.tfp != 'direct':
  125.             print ' * No %s with direct rendering context' %tfp
  126.             if self.tfp == 'indirect':
  127.                 print ' ... present with indirect rendering, exporting: LIBGL_ALWAYS_INDIRECT=1'
  128.                 os.environ['LIBGL_ALWAYS_INDIRECT'] = '1'
  129.             else:
  130.                 # If using Xgl with a proprietary driver, exports LD_PRELOAD=<mesa libGL>
  131.                 if self.Xgl and self.glx_vendor != 'SGI':
  132.                     print ' * Non-mesa driver on Xgl detected'
  133.                     from data import mesa_libgl_locations
  134.                     location = [l for l in mesa_libgl_locations if os.path.exists(l)]
  135.                     if location:
  136.                         print ' ... exporting: LD_PRELOAD=%s' %location[0]
  137.                         os.environ['LD_PRELOAD'] = location[0]
  138.                         if run(['glxinfo'], 'output').count(tfp) >= 3:
  139.                             self.tfp = 'direct'
  140.                         
  141.                     else:
  142.                         # kindly let the user know... but don't abort (maybe it will work :> )
  143.                         print ' ... no mesa libGL found for preloading, this may not work!'
  144.                 else:
  145.                     print ' ... nor with indirect rendering, this isn\'t going to work!'
  146.  
  147.         # Check for nvidia on Xorg
  148.         if not self.Xgl and self.glx_vendor == 'NVIDIA Corporation':
  149.             print ' * NVIDIA on Xorg detected, exporting: __GL_YIELD=NOTHING'
  150.             os.environ['__GL_YIELD'] = 'NOTHING'
  151.  
  152. env = Environment()
  153.  
  154.